﻿using System;
using System.Collections.Generic;
using System.Text;
using daStaticAnalyser.Analysers;
using daBase.Analyser;
using daSyntaxAnalyser.SyntaxTree;
using daStaticAnalyser;

namespace DifferentAnalizers
{
    [AnalyserDefaultSettings("Анализатор глобальных переменных", "Обнаружена глобальная переменная", 0, "Описание ошибки")]
    public class GlobalVarAnalyzer : BaseStaticAnalyser
    {
        string CurFile = "";
        int КоличествоГлобальныхПеременных = 0;

        protected override void DoAnalyse(SyntaxTreeArgs e)
        {
            if (CurFile == "") CurFile = e.Element.StartInfo.File;
            if (e.Element is UnitElement)
            {
                UnitElement ue = e.Element as UnitElement;

                foreach (ISyntaxTreeElement intf in ue.Interfaces)
                {
                    var VarDeclarations = intf as VarDeclarationsElement;
                    var TypeDeclarations = intf as TypeDeclarationsElement;
                    if (VarDeclarations != null)//Раздел var в модуле
                    {
                        foreach (var VarDeclaration in VarDeclarations)
                        {
                            AddError(VarDeclaration.StartInfo, "Глобальная переменная " + VarDeclaration.ToString());
                            КоличествоГлобальныхПеременных++;
                        }
                    }
                    else if (TypeDeclarations != null)//Раздел type в модуле
                    {
                        foreach (var type in TypeDeclarations.Declarations)
                        {
                            var def = type.Definition as FullClassDefinitionElement;
                            if (def == null) continue;
                            foreach (var sec in def.Sections)
                            {
                                var temp = sec as ClassSectionElement;
                                if (temp == null) continue;
                                foreach (var elt in temp.Elements)
                                {
                                    var vars = elt as VarDeclarationsElement;
                                    var var_one = elt as VarDeclarationElement;
                                    if (vars != null)
                                    {
                                        foreach (var v in vars)
                                        {
                                            AddError(v.StartInfo, "Глобальная переменная " + v.ToString());
                                            КоличествоГлобальныхПеременных++;
                                        }
                                    }
                                    else if (var_one != null)
                                    {
                                        AddError(var_one.StartInfo, "Глобальная переменная " + var_one.ToString());
                                        КоличествоГлобальныхПеременных++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        protected override void DoFinishAnalyse(EventArgs e)
        {
            //AddMetric("Количество глобальных переменных", КоличествоГлобальныхПеременных, CurFile);
            //КоличествоГлобальныхПеременных = 0;
            //CurFile = "";
        }
    }
}
